
// this function takes ownership of a boxed i32 and destroys it
// 所有权，被拿走了
fn eat_box_i32(boxed_i32: Box<i32>)  {
    println!("I am eating a box of i32: {}", boxed_i32);
}

// 借用，只是针对引用而言，要值，不要所有权
// this function borrows a boxed i32 and does not destroy it
fn borrow_box_i32(boxed_i32: &i32) {
    println!("I am borrowing a box of i32: {}", boxed_i32);
}

fn main() {
    // 数字后可以加下划线，增加可读性
    let boxed_i32 = Box::new(5_i32);
    let stacked_i32 = 6_i32;

    // 借用，只是针对引用而言，要值，不要所有权
    borrow_box_i32(&boxed_i32);
    borrow_box_i32(&stacked_i32);


    {
        // 把为boxed_i32创建的引用，绑定到一个新的变量中，就是有两个指针
        let _ref_to_boxed_i32: &i32 = &boxed_i32;
        
        // 错误：要所有权，但是已经被借用了 
        // eat_box_i32(boxed_i32); // 所有权，被拿走了

        // 借用
        borrow_box_i32(_ref_to_boxed_i32);
    }
    // 当有人借的时候，不能据为已有
    eat_box_i32(boxed_i32); // 这时候可以拿走所有权，因为借用结束了
}